package br.unicamp.ic.inf312.arena.visao.usuariosistema;

import javax.swing.JPanel;

import br.unicamp.ic.inf312.arena.modelo.controleacesso.Perfil;
import br.unicamp.ic.inf312.arena.modelo.controleacesso.UsuarioSistema;
import br.unicamp.ic.inf312.arena.persistencia.dao.IEventoDAO;
import br.unicamp.ic.inf312.arena.persistencia.dao.IUsuarioPerfilDAO;
import br.unicamp.ic.inf312.arena.persistencia.dao.impl.UsuarioPerfilDAOMySQL;
import br.unicamp.ic.inf312.arena.util.I18nManager;
import br.unicamp.ic.inf312.arena.visao.Menu;
import br.unicamp.ic.inf312.arena.visao.SimpleTableCellRenderer;
import br.unicamp.ic.inf312.framework.persistencia.DataAccessObjectFactory;

import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.Dimension;
import javax.swing.JScrollPane;
import javax.swing.BorderFactory;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import java.awt.Font;
import java.awt.Color;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.Point;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import java.awt.GridBagLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.GridBagConstraints;
import java.awt.BorderLayout;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.swing.JPasswordField;
import javax.swing.JComboBox;
import java.awt.ComponentOrientation;
import javax.swing.ImageIcon;

import net.sf.nachocalendar.CalendarFactory;
import net.sf.nachocalendar.components.DateField;
import javax.swing.border.BevelBorder;

//TODO: Alteracao para a ativ. 1
public class CadastroUsuarioSistema extends JPanel {
	private Menu   frameCentral = null;

	private static final long serialVersionUID = 1L;

	private JLabel lblTitulo = null;

	private JLabel lblProcurar = null;

	private JTextField txtProcurar = null;

	private JButton btnConsultar = null;

	private JButton btnAdicionar = null;

	private JButton btnRemover = null;

	private JScrollPane scrUsuarios = null;

	private JTable tblUsuarios = null;
	
	// tratador de eventos dos botoes
	private ButtonsHandler btnHandler = null;
	
	// DAO para dados de usuarios
	private IUsuarioPerfilDAO daoUsuarios = null;
	
	// Dialogo para adicionar novo usuario
	private JDialog dlgAdicionarUsuario = null;  //  @jve:decl-index=0:visual-constraint="445,6"

	private JPanel pnlUsuarios = null;

	private JPanel pnlCadastroUsuario = null;

	private JLabel lblLogin = null;

	private JLabel lblSenha = null;

	private JLabel lblPerfil = null;

	private JTextField txtLogin = null;

	private JPasswordField pwdSenha = null;

	private JComboBox cbxPerfil = null;

	private JButton btnSalvar = null;

	private JButton btnCancelar = null;

	private JLabel lblNome = null;

	private JLabel lblDataNasc = null;

	private JLabel lblDocumento = null;

	private JLabel lblDepartamento = null;

	private JTextField txtNome = null;

	private JTextField txtDocumento = null;

	private JTextField txtDepartamento = null;

	private JPanel pnlFuncionario = null;

	private JPanel pnlUsuario = null;
	
	private DateField dtNascimento = null;

	/**
	 * This is the default constructor
	 */
	public CadastroUsuarioSistema() {
		super();
		initialize();
	}
	
	public CadastroUsuarioSistema(Menu frame) {
		super();
		frameCentral = frame;
		initialize();
	}	

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		// inicializa o tratador de eventos de botoes
		this.btnHandler = new ButtonsHandler();
		
		// inicializa o DAO de usuarios
		try
		{
			this.daoUsuarios = (IUsuarioPerfilDAO) DataAccessObjectFactory.getImpl(IUsuarioPerfilDAO.class);
		}
		catch ( Exception exc )
		{
			exc.printStackTrace();
		}
		
		lblProcurar = new JLabel();		
		//TODO: Alteracao para a ativ. 3
		lblProcurar.setText( I18nManager.getInstance().getPropriedadeString("cadastrousuario.label.procurar"));
		
		lblProcurar.setSize(new Dimension(55, 20));
		lblProcurar.setHorizontalAlignment(SwingConstants.RIGHT);
		lblProcurar.setLocation(new Point(15, 240));
		lblTitulo = new JLabel();
		lblTitulo.setHorizontalTextPosition(SwingConstants.CENTER);
		lblTitulo.setHorizontalAlignment(SwingConstants.CENTER);
		lblTitulo.setFont(new Font("Dialog", Font.BOLD, 14));
		lblTitulo.setBounds(new Rectangle(14, 13, 396, 19));
		//TODO: Alteracao para a ativ. 3
		lblTitulo.setText( I18nManager.getInstance().getPropriedadeString("cadastrousuario.label.titulo"));
		
		this.setLayout(null);
        this.setPreferredSize(new java.awt.Dimension(100,300));
        this.setSize(430, 312);
        this.add(lblProcurar, null);
        this.add(getTxtProcurar(), null);
        this.add(getBtnConsultar(), null);
        this.add(getBtnAdicionar(), null);
        this.add(getBtnRemover(), null);
        this.add(lblTitulo, null);
        this.add(getPnlUsuarios(), null);
        
        dlgAdicionarUsuario = new JDialog();
        dlgAdicionarUsuario.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
        dlgAdicionarUsuario.setContentPane(getPnlCadastroUsuario());
        dlgAdicionarUsuario.setSize(new Dimension(447, 267));        
		//TODO: Alteracao para a ativ. 3
        dlgAdicionarUsuario.setTitle( I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.titulo"));
        
        // carrega os usuarios cadastrados
        this.carregarUsuarios();
	}

	/**
	 * This method initializes txtProcurar	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtProcurar() {
		if (txtProcurar == null) {
			txtProcurar = new JTextField();
			txtProcurar.setLocation(new Point(75, 240));
			txtProcurar.setSize(new Dimension(211, 20));
		}
		return txtProcurar;
	}

	/**
	 * This method initializes btnConsultar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnConsultar() {
		if (btnConsultar == null) {
			btnConsultar = new JButton();
			btnConsultar.setFont(new Font("Dialog", Font.BOLD, 10));
			btnConsultar.setLocation(new Point(300, 240));
			btnConsultar.setSize(new Dimension(95, 20));
			//TODO: Alteracao para a ativ. 3
			btnConsultar.setIcon(new ImageIcon(getClass().getResource("/icones/defaults_ps.gif")));
			btnConsultar.setText( I18nManager.getInstance().getPropriedadeString("cadastrousuario.botao.consultar"));
			
			// adiciona o tratador de eventos
			btnConsultar.addActionListener( this.btnHandler );
		}
		return btnConsultar;
	}

	/**
	 * This method initializes btnAdicionar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnAdicionar() {
		if (btnAdicionar == null) {
			btnAdicionar = new JButton();
			btnAdicionar.setLocation(new Point(103, 276));
			btnAdicionar.setFont(new Font("Dialog", Font.BOLD, 10));
			btnAdicionar.setSize(new Dimension(95, 20));
			//TODO: Alteracao para a ativ. 3
			btnAdicionar.setIcon(new ImageIcon(getClass().getResource("/icones/add_obj.gif")));
			btnAdicionar.setText( I18nManager.getInstance().getPropriedadeString("cadastrousuario.botao.adicionar"));
			
			// adiciona o tratador de eventos
			btnAdicionar.addActionListener( this.btnHandler );
		}
		return btnAdicionar;
	}

	/**
	 * This method initializes btnRemover	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnRemover() {
		if (btnRemover == null) {
			btnRemover = new JButton();
			btnRemover.setFont(new Font("Dialog", Font.BOLD, 10));
			btnRemover.setLocation(new Point(222, 277));
			btnRemover.setSize(new Dimension(95, 20));
			btnRemover.setPreferredSize(new Dimension(81, 24));
			btnRemover.setEnabled(false);
			//TODO: Alteracao para a ativ. 3
			btnRemover.setIcon(new ImageIcon(getClass().getResource("/icones/delete_obj.gif")));
			btnRemover.setText( I18nManager.getInstance().getPropriedadeString("cadastrousuario.botao.remover"));
			
			// adiciona o tratador de eventos
			btnRemover.addActionListener( this.btnHandler );
		}
		return btnRemover;
	}

	/**
	 * This method initializes scrUsuarios	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getScrUsuarios() {
		if (scrUsuarios == null) {
			scrUsuarios = new JScrollPane();
			scrUsuarios.setViewportView(getTblUsuarios());
		}
		return scrUsuarios;
	}

	/**
	 * This method initializes tblUsuarios	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getTblUsuarios() {
		if (tblUsuarios == null) {
			tblUsuarios = new JTable();
			//TODO: Alteracao para a ativ. 1
			tblUsuarios.setDefaultRenderer( Object.class, new SimpleTableCellRenderer(SimpleTableCellRenderer.TEXT_ALIGNMENT_CENTER) );
			tblUsuarios.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			
			// adiciona o tratador de eventos
			tblUsuarios.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
				public void valueChanged( ListSelectionEvent evt )
				{
					// habilita o botao de remover somente se existir algum usuario selecionado
					btnRemover.setEnabled(-1 < tblUsuarios.getSelectedRow());
				}
			});
		}
		return tblUsuarios;
	}
	
	/**
	 * This method initializes pnlUsuarios	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getPnlUsuarios() {
		if (pnlUsuarios == null) {
			pnlUsuarios = new JPanel();
			pnlUsuarios.setLayout(new BorderLayout());
			pnlUsuarios.setBounds(new Rectangle(16, 40, 394, 189));
			//TODO: Alteracao para a ativ. 3
			pnlUsuarios.setBorder(BorderFactory.createTitledBorder(null,I18nManager.getInstance().getPropriedadeString("cadastrousuario.tabelausuarios.titulo"),
					TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));			
			pnlUsuarios.add(getScrUsuarios(), BorderLayout.CENTER);
		}
		return pnlUsuarios;
	}
	
	//-------------------------------------------------
	private void carregarUsuarios()
	//-------------------------------------------------
	{
		try
		{
			// verifica se ha algum filtro a ser aplicado
			String filtro = txtProcurar.getText().trim();
			
			if ( 0 < filtro.length() )
				this.tblUsuarios.setModel(new UsuarioTableModel(this.daoUsuarios.getUsuariosPorFiltro(filtro)));
				
			else
				this.tblUsuarios.setModel(new UsuarioTableModel(this.daoUsuarios.getAllUsuarios()));
		}
		catch ( Exception exc )
		{
			//TODO: Alteracao para a ativ. 3
			JOptionPane.showMessageDialog(null,
					I18nManager.getInstance().getPropriedadeString("cadastrousuario.tabelausuarios.erro"),
					I18nManager.getInstance().getPropriedadeString("cadastrousuario.tabelausuarios.titulo"), JOptionPane.ERROR_MESSAGE );
		}
	}
	

	/**
	 * This method initializes pnlCadastroUsuario	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getPnlCadastroUsuario() {
		if (pnlCadastroUsuario == null) {
			lblDepartamento = new JLabel();
			lblDepartamento.setText(I18nManager.getInstance().getPropriedadeString("cadastrousuario.label.departamento"));
			lblDepartamento.setLocation(new Point(204, 59));
			lblDepartamento.setHorizontalAlignment(SwingConstants.RIGHT);
			lblDepartamento.setSize(new Dimension(90, 16));
			
			lblDocumento = new JLabel();
			lblDocumento.setText(I18nManager.getInstance().getPropriedadeString("cadastrousuario.label.documento"));
			lblDocumento.setHorizontalAlignment(SwingConstants.RIGHT);
			lblDocumento.setBounds(new Rectangle(204, 29, 90, 16));
			
			lblDataNasc = new JLabel();
			lblDataNasc.setText(I18nManager.getInstance().getPropriedadeString("cadastrousuario.label.nascimento"));
			lblDataNasc.setHorizontalAlignment(SwingConstants.LEFT);
			lblDataNasc.setBounds(new Rectangle(9, 59, 63, 16));
			
			lblNome = new JLabel();
			lblNome.setText(I18nManager.getInstance().getPropriedadeString("cadastrousuario.label.nome"));
			lblNome.setHorizontalTextPosition(SwingConstants.TRAILING);
			lblNome.setHorizontalAlignment(SwingConstants.LEFT);
			lblNome.setBounds(new Rectangle(9, 29, 63, 16));
			
			lblPerfil = new JLabel();
			lblPerfil.setText( I18nManager.getInstance().getPropriedadeString("cadastrousuario.label.perfil"));
			lblPerfil.setLocation(new Point(9, 58));
			lblPerfil.setHorizontalAlignment(SwingConstants.LEFT);
			lblPerfil.setSize(new Dimension(63, 16));
			
			lblSenha = new JLabel();
			lblSenha.setText( I18nManager.getInstance().getPropriedadeString("cadastrousuario.label.senha"));
			lblSenha.setLocation(new Point(204, 27));
			lblSenha.setHorizontalAlignment(SwingConstants.RIGHT);
			lblSenha.setSize(new Dimension(90, 16));
			
			lblLogin = new JLabel();
			lblLogin.setText( I18nManager.getInstance().getPropriedadeString("cadastrousuario.label.login"));
			lblLogin.setLocation(new Point(9, 27));
			lblLogin.setHorizontalAlignment(SwingConstants.LEFT);
			lblLogin.setSize(new Dimension(63, 16));
			
			pnlCadastroUsuario = new JPanel();
			pnlCadastroUsuario.setLayout(null);
			pnlCadastroUsuario.add(getBtnSalvar(), null);
			pnlCadastroUsuario.add(getBtnCancelar(), null);
			pnlCadastroUsuario.add(getPnlFuncionario(), null);
			pnlCadastroUsuario.add(getPnlUsuario(), null);
		}
		return pnlCadastroUsuario;
	}

	/**
	 * This method initializes txtLogin	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtLogin() {
		if (txtLogin == null) {
			txtLogin = new JTextField();
			txtLogin.setSize(new Dimension(120, 20));
			txtLogin.setLocation(new Point(76, 25));
		}
		return txtLogin;
	}

	/**
	 * This method initializes pwdSenha	
	 * 	
	 * @return javax.swing.JPasswordField	
	 */
	private JPasswordField getPwdSenha() {
		if (pwdSenha == null) {
			pwdSenha = new JPasswordField();
			pwdSenha.setSize(new Dimension(120, 20));
			pwdSenha.setLocation(new Point(300, 25));
		}
		return pwdSenha;
	}

	/**
	 * This method initializes cbxPerfil	
	 * 	
	 * @return javax.swing.JComboBox	
	 */
	private JComboBox getCbxPerfil() {
		if (cbxPerfil == null) {
			cbxPerfil = new JComboBox();
			try
			{
				// carrega os perfis cadastrados no BD
				cbxPerfil.setModel(new DefaultComboBoxModel(daoUsuarios.getAllPerfis().toArray()));				
				cbxPerfil.setLocation(new Point(76, 56));
				cbxPerfil.setSize(new Dimension(120, 20));
			}
			catch ( Exception exc )
			{
				exc.printStackTrace();
			}			
		}
		return cbxPerfil;
	}

	/**
	 * This method initializes btnSalvar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnSalvar() {
		if (btnSalvar == null) {
			btnSalvar = new JButton();
			btnSalvar.setLocation(new Point(112, 207));
			btnSalvar.setSize(new Dimension(95, 20));
			btnSalvar.setFont(new Font("Dialog", Font.BOLD, 10));
			//TODO: Alteracao para a ativ. 3
			btnSalvar.setIcon(new ImageIcon(getClass().getResource("/icones/save_edit.gif")));
			btnSalvar.setIconTextGap(5);
			btnSalvar.setText( I18nManager.getInstance().getPropriedadeString("cadastrousuario.botao.salvar"));
			
			// adiciona o tratador de eventos
			btnSalvar.addActionListener( this.btnHandler );
		}
		return btnSalvar;
	}

	/**
	 * This method initializes btnCancelar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnCancelar() {
		if (btnCancelar == null) {
			btnCancelar = new JButton();
			btnCancelar.setLocation(new Point(240, 207));
			btnCancelar.setSize(new Dimension(95, 20));
			btnCancelar.setFont(new Font("Dialog", Font.BOLD, 10));
			//TODO: Alteracao para a ativ. 3
			btnCancelar.setIcon(new ImageIcon(getClass().getResource("/icones/undo_edit.gif")));
			btnCancelar.setIconTextGap(5);
			btnCancelar.setText( I18nManager.getInstance().getPropriedadeString("cadastrousuario.botao.cancelar"));
			
			// adiciona o tratador de eventos
			btnCancelar.addActionListener( this.btnHandler );
		}
		return btnCancelar;
	}

	/**
	 * This method initializes txtNome	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtNome() {
		if (txtNome == null) {
			txtNome = new JTextField();
			txtNome.setBounds(new Rectangle(76, 27, 120, 20));
		}
		return txtNome;
	}
	
	private DateField getDtNascimento()
	{
		if (dtNascimento == null) {
			dtNascimento = CalendarFactory.createDateField();
			dtNascimento.setLocation(new Point(76, 57));
			dtNascimento.setSize(new Dimension(120, 20));
		}
		return dtNascimento;
	}

	/**
	 * This method initializes txtDocumento	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtDocumento() {
		if (txtDocumento == null) {
			txtDocumento = new JTextField();
			txtDocumento.setBounds(new Rectangle(300, 27, 120, 20));
		}
		return txtDocumento;
	}

	/**
	 * This method initializes txtDepartamento	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtDepartamento() {
		if (txtDepartamento == null) {
			txtDepartamento = new JTextField();
			txtDepartamento.setSize(new Dimension(120, 20));
			txtDepartamento.setLocation(new Point(300, 57));
		}
		return txtDepartamento;
	}

	/**
	 * This method initializes pnlFuncionario	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getPnlFuncionario() {
		if (pnlFuncionario == null) {
			pnlFuncionario = new JPanel();
			pnlFuncionario.setLayout(null);
			pnlFuncionario.setSize(new Dimension(426, 85));
			pnlFuncionario.setLocation(new Point(7, 7));
			pnlFuncionario.setBorder(BorderFactory.createTitledBorder(null,I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.infogerais.titulo"),
					TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));			
			pnlFuncionario.add(lblNome, null);
			pnlFuncionario.add(lblDataNasc, null);
			pnlFuncionario.add(getTxtNome(), null);
			pnlFuncionario.add(getDtNascimento(), null);
			pnlFuncionario.add(lblDocumento, null);
			pnlFuncionario.add(lblDepartamento, null);
			pnlFuncionario.add(getTxtDocumento(), null);
			pnlFuncionario.add(getTxtDepartamento(), null);
		}
		return pnlFuncionario;
	}

	/**
	 * This method initializes pnlUsuario	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getPnlUsuario() {
		if (pnlUsuario == null) {
			pnlUsuario = new JPanel();
			pnlUsuario.setLayout(null);			
			pnlUsuario.setBorder(BorderFactory.createTitledBorder(null,I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.acessibilidade.titulo"),
					TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));			
			pnlUsuario.setSize(new Dimension(426, 88));
			pnlUsuario.setLocation(new Point(7, 100));
			pnlUsuario.add(lblLogin, null);
			pnlUsuario.add(getTxtLogin(), null);
			pnlUsuario.add(lblSenha, null);
			pnlUsuario.add(getPwdSenha(), null);
			pnlUsuario.add(lblPerfil, null);
			pnlUsuario.add(getCbxPerfil(), null);
		}
		return pnlUsuario;
	}
	
	/**
	 * Classe interna para tratar os eventos gerados pelos botoes 
	 * (adicionar, remover, consultar, salvar, cancelar).
	 * 
	 * @author Grupo X
	 */
	//==============================================================
	private class ButtonsHandler implements ActionListener
	//==============================================================
	{
		//-------------------------------------------------
		public void actionPerformed( ActionEvent evt )
		//-------------------------------------------------
		{
			// remover usuario
			if ( btnRemover == evt.getSource() )
			{
				// obtem o usuario selecionado
				UsuarioSistema usuario = ((UsuarioTableModel) tblUsuarios.getModel()).getUsuario(tblUsuarios.getSelectedRow());
				
				
				// dialogo de confirmacao para remover o usuario selecionado
				//TODO: Alteracao para a ativ. 3
				if ( JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(null, 
						I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.remover.confirmar") + " " + usuario.getLogin() + "?",
						I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.remover.titulo"), JOptionPane.OK_CANCEL_OPTION))
				{
					try
					{
						// tenta remover o usuario selecionado
						if ( daoUsuarios.removerUsuario(usuario) )
						{
							// recarrega a lista de usuarios
							carregarUsuarios();
							
							// msg de confirmacao
							//TODO: Alteracao para a ativ. 3
							JOptionPane.showMessageDialog(null, I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.remover.sucesso"),
									I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.remover.titulo"), JOptionPane.INFORMATION_MESSAGE );
						}
						// ooops, nao removeu o usuario..
						else
							throw new Exception();
					}
					catch (Exception exc)
					{
						//TODO: Alteracao para a ativ. 3
						JOptionPane.showMessageDialog(null, I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.remover.erro"),
								I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.remover.titulo"), JOptionPane.ERROR_MESSAGE );						
					}
				}
			}
			// adicionar usuario
			else if ( btnAdicionar == evt.getSource() )
			{
				// limpa os campos de edicao
				limparCamposAdicionarUsuario();
				
				// mostra o dialogo para entrada de dados do usuario
				dlgAdicionarUsuario.setVisible(true);
			}
			
			// consultar usuario
			else if ( btnConsultar == evt.getSource() )
			{
				// carrega os usuarios, conforme o filtro
				carregarUsuarios();
			}
			
			// salvar adicao usuario
			else if ( btnSalvar == evt.getSource() )
			{
				// consiste os dados do usuario
				if ( consistirDadosAdicionarUsuario() )
				{
					// coleta os dados
					UsuarioSistema usuario = new UsuarioSistema();
					usuario.setNome(txtNome.getText().trim());
					usuario.setDocumento(txtDocumento.getText().trim());
					usuario.setDepartamento(txtDepartamento.getText().trim());
					usuario.setDataNascimento((Date) dtNascimento.getValue());
					
					usuario.setLogin(txtLogin.getText().trim());
					usuario.setSenha(new String(pwdSenha.getPassword()));
					usuario.setPerfil((Perfil) cbxPerfil.getSelectedItem());
					
					try
					{
						// tenta remover o usuario selecionado
						if ( daoUsuarios.adicionarUsuario(usuario) )
						{
							// recarrega a lista de usuarios
							carregarUsuarios();
							
							// msg de confirmacao
							//TODO: Alteracao para a ativ. 3
							JOptionPane.showMessageDialog(null, I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.sucesso"),
									I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.titulo"), JOptionPane.INFORMATION_MESSAGE );
							
							// esconde o dialogo de edicao de dados do usuario
							dlgAdicionarUsuario.setVisible(false);
							
							// limpa os campos de edicao
							limparCamposAdicionarUsuario();
						}
						// ooops, nao removeu o usuario..
						else
							throw new Exception();
					}
					catch (Exception exc)
					{
						//TODO: Alteracao para a ativ. 3
						JOptionPane.showMessageDialog(null, I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.erro"), 
								I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.titulo"), JOptionPane.ERROR_MESSAGE );
						
						exc.printStackTrace();
					}
				}
			}
			
			// cancelar adicao usuario
			else if ( btnCancelar == evt.getSource() )
			{
				// esconde o dialogo de edicao de dados do usuario
				dlgAdicionarUsuario.setVisible(false);
				
				// limpa os campos de edicao
				limparCamposAdicionarUsuario();
			}
		}
		
		//-------------------------------------------------
		private void limparCamposAdicionarUsuario()
		//-------------------------------------------------
		{
			txtNome.setText("");
			txtDocumento.setText("");
			txtDepartamento.setText("");
			txtLogin.setText("");			
			pwdSenha.setText("");
			dtNascimento.setValue(new Date());
		}
		
		//-------------------------------------------------
		private boolean consistirDadosAdicionarUsuario()
		//-------------------------------------------------
		{
			if ( txtNome.getText().trim().length() == 0 )
			{
				//TODO: Alteracao para a ativ. 3
				JOptionPane.showMessageDialog(null, I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.camponome"),
						I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.titulo"), JOptionPane.ERROR_MESSAGE );
				txtNome.setText("");
				txtNome.requestFocus();
				return ( false );
			}
			
			if ( txtLogin.getText().trim().length() == 0 )
			{
				//TODO: Alteracao para a ativ. 3
				JOptionPane.showMessageDialog(null, I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.campologin"),
						I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.titulo"), JOptionPane.ERROR_MESSAGE );
				txtLogin.setText("");
				txtLogin.requestFocus();
				return ( false );
			}
			
			if ( pwdSenha.getPassword().length == 0 )
			{
				//TODO: Alteracao para a ativ. 3
				JOptionPane.showMessageDialog(null, I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.camposenha"),
						I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.titulo"), JOptionPane.ERROR_MESSAGE );
				pwdSenha.setText("");
				pwdSenha.requestFocus();
				return ( false );
			}
			
			if ( cbxPerfil.getSelectedIndex() < 0 )
			{
				//TODO: Alteracao para a ativ. 3
				JOptionPane.showMessageDialog(null, I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.campoperfil"), 
						I18nManager.getInstance().getPropriedadeString("cadastrousuario.dialogo.adicionar.titulo"), JOptionPane.ERROR_MESSAGE );
				cbxPerfil.requestFocus();
				return ( false );
			}
			
			return ( true );
		}
	}
}  //  @jve:decl-index=0:visual-constraint="7,8"
